package cn.infrabase.core.util;

import cn.infrabase.core.text.CharSequenceUtils;
import cn.infrabase.core.text.StringPool;

import java.nio.ByteBuffer;
import java.nio.charset.Charset;

/**
 * 字符串工具类。
 *
 * @author Weimin Gao
 * @since 1.0.0
 **/
public class StringUtils extends CharSequenceUtils implements StringPool {

	/**
	 * <pre>
	 * 将给定的字节数组根据指定的字符集解码成对应的字符串。
	 * 说明：
	 * 1、如果给定的字节数据为null时则返回null。
	 * 2、如果指定的字符集，则解码使用UTF-8字符集。
	 * </pre>
	 *
	 * @param bytes   给定的字节数组。
	 * @param charset 指定的字符集。
	 * @return 解码后的字符串。
	 */
	public static String str(byte[] bytes, String charset) {
		return str(bytes, CharsetUtils.charset(charset));
	}

	/**
	 * <pre>
	 * 将给定的字节数组根据指定的字符集解码成对应的字符串。
	 * 说明：
	 * 1、如果给定的字节数据为null时则返回null。
	 * 2、如果指定的字符集，则解码使用UTF-8字符集。
	 * </pre>
	 *
	 * @param data    给定的字节数组。
	 * @param charset 指定的字符集。
	 * @return 解码后的字符串。
	 */
	public static String str(byte[] data, Charset charset) {
		if (data == null) {
			return null;
		}
		if (null == charset) {
			return new String(data);
		}
		return new String(data, charset);
	}

	/**
	 * <pre>
	 * 将给定的字符数组根据指定的字符集解码成对应的字符串。
	 * 说明：
	 * 1、如果给定的字符数据为null时则返回null。
	 * 2、如果指定的字符集，则解码使用UTF-8字符集。
	 * </pre>
	 *
	 * @param bytes   给定的字符数组。
	 * @param charset 指定的字符集。
	 * @return 解码后的字符串。
	 */
	public static String str(Byte[] bytes, String charset) {
		return str(bytes, CharsetUtils.charset(charset));
	}

	/**
	 * <pre>
	 * 将给定的字符数组根据指定的字符集解码成对应的字符串。
	 * 说明：
	 * 1、如果给定的字符数据为null时则返回null。
	 * 2、如果指定的字符集，则解码使用UTF-8字符集。
	 * </pre>
	 *
	 * @param data    给定的字符数组。
	 * @param charset 指定的字符集。
	 * @return 解码后的字符串。
	 */
	public static String str(Byte[] data, Charset charset) {
		if (data == null) {
			return null;
		}
		byte[] bytes = new byte[data.length];
		Byte dataByte;
		for (int i = 0; i < data.length; i++) {
			dataByte = data[i];
			bytes[i] = (null == dataByte) ? -1 : dataByte;
		}
		return str(bytes, charset);
	}

	/**
	 * <pre>
	 * 将给定的字符缓存数据根据指定的字符集解码成对应的字符串。
	 * 说明：
	 * 1、如果给定的字符缓存数据为null时则返回null。
	 * 2、如果指定的字符集，则解码使用UTF-8字符集。
	 * </pre>
	 *
	 * @param data    给定的字符缓存数。
	 * @param charset 指定的字符集。
	 * @return 解码后的字符串。
	 */
	public static String str(ByteBuffer data, String charset) {
		if (data == null) {
			return null;
		}
		return str(data, CharsetUtils.charset(charset));
	}

	/**
	 * <pre>
	 * 将给定的字符缓存数根据指定的字符集解码成对应的字符串。
	 * 说明：
	 * 1、如果给定的字符缓存数据为null时则返回null。
	 * 2、如果指定的字符集，则解码使用UTF-8字符集。
	 * </pre>
	 *
	 * @param data    给定的字符缓存数。
	 * @param charset 指定的字符集。
	 * @return 解码后的字符串。
	 */
	public static String str(ByteBuffer data, Charset charset) {
		if (null == charset) {
			charset = Charset.defaultCharset();
		}
		return charset.decode(data).toString();
	}

}
